package table

import (
	"errors"
	"fmt"

	"github.com/cloudwego/hertz/pkg/common/hlog"
	"gorm.io/gorm"
)

func InsertsCheck(tx *gorm.DB, RowsAffected int64) error {
	if tx.Error != nil {
		return tx.Error
	}
	if tx.RowsAffected != RowsAffected {
		return fmt.Errorf("Insert失败,影响行数与预期不一致[%d:%d]", tx.RowsAffected, RowsAffected)
	}

	// 成功找到记录，返回记录指针
	return nil
}

func InsertCheck(tx *gorm.DB) error {
	return InsertsCheck(tx, 1)
}

func SelectCheck[T any](ptr *T, tx *gorm.DB) (*T, error) {

	if tx.Error != nil {
		hlog.Debug("tx.err != nil")
		if errors.Is(tx.Error, gorm.ErrRecordNotFound) {
			hlog.Debug("tx.err == notfound")
			// 记录未找到，返回nil和nil错误
			return nil, nil
		}
		// 其他数据库错误
		return nil, tx.Error
	}
	if tx.RowsAffected == 0 {
		hlog.Debugf("tx.err == nil, tx.RowsAffected=0")
		return nil, nil
	}
	hlog.Debugf("tx.err == nil, tx.RowsAffected!=0")
	// 成功找到记录，返回记录指针
	return ptr, nil
}

func UpdatesCheck(tx *gorm.DB, RowsAffected int64) error {
	if tx.Error != nil {
		return tx.Error
	}
	return nil
}

func UpdateCheck(tx *gorm.DB) error {
	return UpdatesCheck(tx, 1)
}

func DeletesCheck(tx *gorm.DB, RowsAffected int64) error {
	if tx.Error != nil {
		return tx.Error
	}
	if tx.RowsAffected != RowsAffected {
		return fmt.Errorf("update失败,影响行数与预期不一致[%d:%d]", tx.RowsAffected, RowsAffected)
	}

	// 成功找到记录，返回记录指针
	return nil
}

func DeleteCheck(tx *gorm.DB) error {
	return DeletesCheck(tx, 1)
}
